package pwd.allen;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 3.5.2版本的代码生成器
 *
 * 官方文档：https://baomidou.com/pages/981406/#%E5%8F%AF%E9%80%89%E9%85%8D%E7%BD%AE
 *
 * @author 门那粒沙
 * @create 2020-06-20 16:34
 **/
public class GenerateCode {

    /**
     * 根据db_user、db_department两张表生成代码到桌面/generate-by-mp/
     * @throws IOException
     */
    @Test
    public void one() throws IOException {

        Properties properties = new Properties();
        properties.load(this.getClass().getClassLoader().getResourceAsStream("dbconfig.properties"));

        FastAutoGenerator.create(properties.getProperty("jdbc.url"), properties.getProperty("jdbc.username"), properties.getProperty("jdbc.password"))
                .globalConfig(builder -> {
                    builder.author("pwdan") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(System.getProperty("user.home") + "/Desktop/generate-by-mp") // 指定输出目录
                            .dateType(DateType.TIME_PACK)   // 日期类型，默认为jdk8新日期类型
                            .commentDate("yyyy-MM-dd") //
                            .disableOpenDir()   // 禁止打开输出目录
                    ;
                })
                .packageConfig(builder -> {
                    builder.parent("com.cdc") // 设置父包名
                            .moduleName("generate") // 设置父包模块名
                            .entity("entity")
                            .xml("mapper.xml")
//                            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://")) // 设置mapperXml生成路径,新版设置方式，暂时没研究
                    ;
                })
//                .templateConfig(builder -> {
//                    // 默认模板：mybatis-plus-generator-3.5.2.jar!/templates/
//                    //指定自定义模板路径, 位置：/resources/templates/entity.java.ftl(或者是.vm)
//                    //注意不要带上.ftl(或者是.vm), 会根据使用的模板引擎自动识别
//                    builder.entity("/template/entity.java")
//                            .controller("/template/controller.java")
//                            .service("/template/service.java")
//                            .serviceImpl("/template/serviceImpl.java")
//                            .mapper("/template/mapper.java")
//                            .xml("/template/mapper.xml");
//                })
                .injectionConfig(builder -> {
                    //自定义属性注入:abc
                    //在.ftl(或者是.vm)模板中，通过${cfg.abc}获取属性
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("abc", "-mp");
                    builder.customMap(map);
                })
                .strategyConfig(builder -> {
                    // 策略配置 可指定需要生成哪些表或者排除哪些表
                    builder.addInclude("db_user")  // 设置需要生成的表名
//                            .addTablePrefix("DB_")  // 设置过滤表前缀
                            .enableCapitalMode() //全局大写命名
                            .enableSkipView()
                            .mapperBuilder()
//                                .superClass("com.cdc.common.dao.IBaseDAO")
                                .formatMapperFileName("I%sDao")
                                .formatXmlFileName("%sMapper")
                                .enableBaseColumnList() //是否在xml中产生BaseColumnList
                                .enableBaseResultMap()
                                .build()
                            .serviceBuilder()
//                                .superServiceClass("com.cdc.common.service.IBaseService")
//                                .superServiceImplClass("com.cdc.common.service.impl.AbstractService")
                                .formatServiceFileName("I%sService")
                                .build()
                            .controllerBuilder()
                                .superClass("com.cdc.api.apiCommon.baseController.BasicController") // 父类控制器,没有就不用设置
                                .enableRestStyle().enableHyphenStyle().build()
                            .entityBuilder()
                                .enableLombok()
                                .enableActiveRecord() // 开启 ActiveRecord 模型
                                .naming(NamingStrategy.underline_to_camel)
                                .columnNaming(NamingStrategy.underline_to_camel) // 默认按naming
//                                .superClass("pwd.allen.entity.BasicEntity")// 你自己的父类实体,没有就不用设置!
                                .addSuperEntityColumns("id")// 写于父类中的公共字段
                                .idType(IdType.AUTO)
                                .build()
                    ;
                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}
